%% -*- coding: utf-8 -*-

%% @doc 抽象構文木から中間表現への変換器
%%
-module(templ_ie).
-export([transform/1]).

%% @doc 抽象構文木 (のリスト) を中間表現に変換する
transform(AS) ->
	tf(AS, []).

tf([{ok,T}|R], S) ->
	tf(R, [{ok,T}|S]);
tf([{expr,Ts}|R], S) ->
	tf(R, [{expr,Ts}|S]);
tf([{'let',X,V}, B|R], S) ->
	tf(R, [{'let',{X,V},transform(B)}|S]);
tf([{'if',C}, B1, elseif, B2|R], S) ->
	tf(R, [{'if',C,transform(B1),transform(B2)}|S]);
tf([{'if',C}, B|R], S) ->
	tf(R, [{'if',C,transform(B),[{ok,[]}]}|S]);
tf([{foreach,X,Vs},B|R], S) ->
	tf(R, [{foreach,{X,Vs},transform(B)}|S]);
tf([], S) ->
	lists:reverse(S);
tf(AS, _) ->
	throw({{?MODULE,einval}, AS, "illformed abstract syntax tree"}).
